package com.demo.cms.dao;

import java.util.List;
import java.util.Map;

import com.demo.cms.model.Category;
import com.demo.core.dao.base.BaseCoreDao;
import com.demo.core.dao.base.support.SearchDaoSupport;

/**
 * 栏目模型数据访问层接口
 * 
 * @author ryuu.kk
 *
 */
public interface CategoryDao extends BaseCoreDao<Category, Long>, SearchDaoSupport<Category>  {

	/**
	 * 更新栏目状态信息
	 * @param category 栏目模型对象
	 * @param categoryStatus 栏目检索信息
	 * @return 成功操作数 
	 */
	int updateStatus(Category category, Map<String, Object> categoryStatus);
	
	/**
	 * 更新栏目的访问许可标记
	 * @param isPermission 是否需要许可
	 * @param categoryStatus 栏目检索条件
	 * @return
	 */
	int updatePermission(boolean isPermission, Map<String, Object> categoryStatus);
	
	/**
	 * 更新栏目的访问分析标记
	 * @param isAnalyse 是否需要分析
	 * @param categoryStatus 栏目检索条件
	 * @return 操作数
	 */
	int updateAnalyse(boolean isAnalyse, Map<String, Object> categoryStatus);
	
	/**
	 * 更新栏目的草稿状态
	 * @param isDraft 是否是草稿
	 * @param categoryStatus 栏目检索条件
	 * @return 操作数
	 */
	int updateDraft(boolean isDraft, Map<String, Object> categoryStatus);
	
	/**
	 * 查询栏目信息树结构
	 * @param params 树节点,深度数组
	 * @return 树List
	 */
	List<Category> tree(Map<String, Object> params);
	
	/**
	 * 查询根节点信息
	 * @param params 参数Map; 可用参数[频道channelId]
	 * @return 类别根节点ID
	 */
	List<Category> findRoot(Map<String, Object> params);
	
	/**
	 * 查找栏目的根节点信息
	 * 该节点应不依赖某一个频道.即频道无关性
	 * 所有栏目(不同频道)都将挂载在该root根上
	 * @return Category 根栏目
	 */
	Category findRoot();
	
	/**
	 * 查找频道的根节点信息
	 * 注意,一个频道只能有一个根栏目
	 * @param channelId 频道ID
	 * @return 栏目对象
	 */
	Category findRoot(Long channelId);
	
	/**
	 * 反向查找频道节点
	 * 该方法实现一个根据根节点参数回溯到他的所有父亲节点。
	 * @return List<Category> 频道列表(按照父亲-儿子顺序排列)
	 */
	List<Category> queryReverse(Map<String, Object> params);

}
